import axios from 'axios'
import storage from 'store'
import notification from 'ant-design-vue/es/notification'
import { VueAxios } from './axios'
import { ACCESS_TOKEN, AUTHORIZATION, APP_USER, WEB_URL } from '@/store/mutation-types'
import router from '@/router'
import { getSsoAuthUrl } from '@/api/sso.js'
import { SMKEY } from '@/enumeration/SM.js'

export const BASE_URL = process.env.VUE_APP_BASE_URL

// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀
  // baseURL: process.env.VUE_APP_API_BASE_URL,
  baseURL: BASE_URL,
  timeout: 60000 // 请求超时时间
})

request.baseURL = BASE_URL

// 定义刷新token开关，防止重复刷
// let isRefreshing = true;
// 等待执行的请求列表
// let waitingRequest = new Array();

// 重试请求函数
// const retryReq = (url, params, method, data) => {
//   return request({
//     url: url,
//     method: method,
//     params: params,
//     data: data
//   })
// }

/**
 * 刷新token函数
 */
// const refreshToken = () => {
//   request({
//     url: '/token/refresh',
//     method: 'post',
//   }).then(res => {
//     if (res.code ===0) {
//       // 标识为可刷新token
//       isRefreshing = true
//       // 执行待重试的请求
//       waitingRequest.forEach((callback) =>{
//         callback();
//       })
//       waitingRequest = []
//     }
//   })
// }

// 异常拦截处理器
const errorHandler = error => {
  // if (error.response) {
  //   const data = error.response.data

  //   // 从 localstorage 获取 token
  //   const token = storage.get(ACCESS_TOKEN)
  //   if (data.code >= 400 && data.code <= 505) {
  //     notification.error({
  //       message: '错误',
  //       description: data.msg
  //     })
  //   }
  //   if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
  //     notification.error({
  //       message: 'Unauthorized',
  //       description: 'Authorization verification failed'
  //     })
  //     if (token) {
  //       store.dispatch('Logout').then(() => {
  //         setTimeout(() => {
  //           window.location.reload()
  //         }, 1500)
  //       })
  //     }
  //   }
  // } else {
  //   const err = error.message
  //   if (err.indexOf('timeout') !== -1) {
  //     notification.error({
  //       message: '错误',
  //       description: '网络繁忙，请稍后重试'
  //     })
  //   } else if (err.indexOf('Network Error') !== -1) {
  //     notification.error({
  //       message: '错误',
  //       description: '服务器异常'
  //     })
  //   }
  // }
  return Promise.reject(error)
}

// request interceptor
request.interceptors.request.use(config => {
  const token = storage.get(ACCESS_TOKEN)
  // 如果 token 存在
  // 让每个请求携带自定义 token 请根据实际情况自行修改
  if (token) {
    config.headers[AUTHORIZATION] = token
  }
  return config
}, errorHandler)

/**
 * 请求返回拦截器
 */
request.interceptors.response.use(async response => {
  const headers = response.headers
  // 如果后端响应了token则更新token
  if (headers.authorization) {
    storage.set(ACCESS_TOKEN, headers.authorization)
  }
  const data = response.data
  // console.log('data', data)
  if (data.code && data.code !== 200) {
    if (data.code <= -1 && data.code >= -5) {
      if (data.code <= -1 && data.code >= -3) {
        notification.error({
          message: '错误',
          description: '您还未登录或登录失效，请重新登录'
        })
      } else if (data.code === -4) {
        notification.error({
          message: '错误',
          description: '您的账号在其他地方登录，请确认账号密码是否已泄露'
        })
      } else if (data.code === -5) {
        notification.error({
          message: '错误',
          description: '您已被管理员强制下线'
        })
      }
      storage.set(ACCESS_TOKEN, '')
      storage.set(APP_USER, '')
      const cres = await getSsoAuthUrl({
        back: WEB_URL + router.currentRoute.fullPath
      })
      window.location.href = cres.data
    } else {
      notification.error({
        message: '错误',
        description: data.msg
      })
    }
  }
  if (data.data !== null) {
    try {
      // console.log('data.code == 0');
      const sm4 = require('sm-crypto').sm4
      const decryptedData = sm4.decrypt(data.data, '268b50bcb143d44f3c27d6390df5e37d')
      data.data = JSON.parse(decryptedData)
      // console.log('解密结果', data)
    } catch (error) {
      return data
    }
  }
  return data
}, errorHandler)

const installer = {
  vm: {},
  install(Vue) {
    Vue.use(VueAxios, request)
  }
}

export default request

export { installer as VueAxios, request as axios }
